// 引入配置信息
import config from './config.js';
 
// 网络请求封装函数
export default function request(url, method, params) {
    // 返回一个Promise对象，用于处理异步请求
    return new Promise((resolve, reject) => {
        // 发起网络请求
        wx.request({
            url: config.baseUrl + url, // 完整的请求URL
            method: method, // 请求方法
            data: method === 'GET' ? params : JSON.stringify(params), // 根据请求方法设置参数格式
            // 设置请求头
            header: {
                // 根据后端API的要求设置Content-Type
                // 如果后端期望接收JSON格式的数据，则使用'application/json'
                // 并相应地修改data参数的格式（例如，使用JSON.stringify(params)）
                'content-type': 'application/json', // 或者 'application/x-www-form-urlencoded'
                'token': uni.getStorageSync("user")?.token || ' ', // 从本地存储中获取token，如果user为空则使用空字符串
            },
            success(res) {
                // 请求成功的回调
                console.log('响应拦截器success接口返回:', res);
                // 根据后端返回的状态码进行不同的处理
                switch (res.data.code) {
                    case '200': // 请求成功
                        resolve(res.data); // 将响应数据传递给Promise的resolve
                        break;
                    case '400': // 客户端请求错误
                        wx.showToast({
                            title: res.data.message || "请求有误，请检查您的输入或联系客服~",
                            icon: "none",
                            duration: 3000
                        });
                        reject(new Error(res.data.message || "客户端请求错误")); // 拒绝Promise并传递错误信息
                        break;
                    case '401': // 未授权
                    case '403': // 禁止访问
                        wx.showToast({
                            title: res.data.code === '401' ? "身份验证已过期，请重新登陆~" : "无权访问，请登录后再访问~",
                            icon: "none",
                            duration: 2000
                        });
                        // 导航到登录页面，注意这里使用redirectTo避免页面栈溢出
                        wx.redirectTo({
                            url: '/pages/login/login'
                        });
                        // 在这种情况下，我们可能不希望拒绝Promise，因为用户可能会重新登录并继续操作
                        // 但如果上层调用者需要知道这个错误，可以考虑使用其他方式通知（如全局事件总线）
                        break;
                    case '404': // 未找到资源
                        wx.showToast({
                            title: "系统出错啦，找不到资源~",
                            icon: "error",
                            duration: 2000
                        });
                        reject(new Error("未找到资源")); // 拒绝Promise并传递错误信息
                        break;
                    default: // 其他错误
                        reject(new Error("未知错误")); // 拒绝Promise并传递默认错误信息
                }
            },
            fail(err) {
                // 请求失败的回调
                console.error('请求失败:', err);
                wx.showToast({
                    title: "系统出现了意想不到的问题!",
                    icon: "none",
                    duration: 2000
                });
                reject(new Error("请求失败: " + (err.errMsg || "未知原因"))); // 拒绝Promise并传递错误信息
            },
            // complete回调通常用于清理工作，比如隐藏加载提示
            // 但在这个例子中，我们没有显示加载提示，所以不需要complete回调
            // 如果需要，可以在这里添加相关逻辑
        });
    });
}